/**
 * 假如不使用
 * type Record<T> = {
      [p in keyof any]: T;
    };
    @description Record和object区别
 */

const goodSymid = Symbol("goodid");
interface Goods {
  [goodSymid]: number;
  name: string;
  price: number;
}
type Record<T> = {
  // S100
  [P in keyof any]: T;
};
// !Record和object区别
// 区别1：Record 获取到是索引参数类型，所以可以赋初值为{}
// 而object也可以，但是再次赋值，比如： goodRecord[103] = good2;
//   会出现错误，会查找103属性是否存在于object类型的对象变量中

// 区别2： Record是泛型，获取值可以有自动提示功能，而object无法实现自动提示。
type resultGoodsType = Record<Goods>;
let good: Goods = { [goodSymid]: 101, name: "苹果", price: 9 };
let obj = {}; // !这样一种情况
let goodRecord = { name: "wangwu", 103: good };
let good2: Goods = { [goodSymid]: 101, name: "苹果", price: 9 };

goodRecord[103] = good2; // 修改103的值为good2,而不能增加103属性名【key],js可以增加
// ! 报错,因为{ name: "wangwu", 103: good }没有这些类型 不能追加类型
// goodRecord["香蕉"] = good;
// goodRecord[good[goodSymid]] = good;


let goodRecord2:object = { name: "wangwu", 103: good };
// ! 报错
// 编译器尝试从object上查找103属性, 但是object什么属性方法都没有,只是单纯表示一个对象的类型,Oject也不行,因为没有103属性
// goodRecord2[103] = good2; 


let goodRecord3: resultGoodsType = {};
goodRecord3[103] = good
goodRecord3["香蕉"] = good;
goodRecord3[good[goodSymid]] = good;

export {};
